#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
//mem_fn的用法，包装使用成员函数，使得成员函数能像普通函数一样实现函数的回调，绑定

class A{
public:
    //是不是偶数
    bool is_even(int value){
        if(value%2==0){
            return true;
        }
        return false;
    }
};
int add(int a,int b){
    return a+b;
}
//bind和function结合起来(普通函数)
void test3(){
    using namespace std::placeholders;
    function<int(int,int)>f=bind(add,_1,_2);
    cout<<f(2,3)<<endl;
}
//bind和function结合起来(成员函数)
void test4(){
    A a;
    using namespace std::placeholders;
    function<bool(A*,int)> f=bind(&A::is_even,_1,_2);
    A* pa=&a;
    cout<<f(pa,5)<<endl; 
}
//直接使用mem_fn,这个函数可以使得成员函数像普通
//函数一样，底层是实现了对函数对象的初始化，返回值就是一个函数对象·
void test6(){
    A a;
    using namespace std::placeholders;
    vector<int> vec={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    auto f=bind(&A::is_even,&a,_1);
    //remove_if这个函数的第三个参数必须是一元的，但是is_even有两个参数
    //remove_if()函数返回的是指向第一个即将被清除的元素，所以可以直接作为参数
    vec.erase(remove_if(vec.begin(),vec.end(),f)
             ,vec.end());
    for(auto ele:vec){
        cout<<ele<<endl;
    }
}
int main(int argc, char * argv[]){
    test6();
    return 0;
}

